import {ListNode} from './listNode.util'
/* 数组要翻转的话可以直接双指针 首尾交换，但是单向链表是不能从尾去访问头的 就像半导体
因此需要额外的辅助节点（指针） 简单的 需要三个
*/

function reverse(head) {
    // 已翻转部分的头结点  待翻转节点   待翻转的下一个节点
    let pre = null, cur = head, next = head.next ;
    while( head) {

        cur.next = pre // 翻转
        pre  = cur // 翻转后cur就是已翻转部分的头结点
        cur = next // 前进
        cur && (next= next.next) // 前进

    }
    return pre 
}

//  回溯法 递归遍历链表，在函数弹栈的时候输出链表的值 就是倒着的
    function iterateList(head){
        if (!node ){ return }
       
    // 在这里做点什么就和正常的迭代顺序是一样 入栈
            iterateList(head)
    // 在这里做点什么就和正常的迭代顺序是相反的 出栈  栈后进先出

        }
    

let  reverseList = function(head) {
    
    let hair = new ListNode(-1),cur = hair
        function reverse(node){
        if (!node || node.next){ return node}
    
        let next = node.next ;
        node.next = pre 
    
    
            return node
        }
        reverse(head)
        return hair.next 
    };